package com.gestion.dao;

import com.gestion.controlador.Session;
import com.gestion.dao.interfaces.IPedidoDAO;
import com.gestion.modelo.dominio.EstadosPedido;
import com.gestion.modelo.dominio.Pedido;
import com.gestion.modelo.dominio.TipoPago;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Mauri@<itsoluciones.com.ar>
 */
public class PedidoDAO implements IPedidoDAO {

    //<editor-fold defaultstate="collapsed" desc="Patrón Singleton">
    private static PedidoDAO Instancia = null;

    public static PedidoDAO getInstancia() {
        if (Instancia == null) {
            crearInstancia();
        }
        return Instancia;
    }

    private static void crearInstancia() {
        Instancia = new PedidoDAO();
    }
  

    public PedidoDAO() {
        //System.out.println(this.toString());
    }
  //</editor-fold>
    @Override
    public List<Pedido> getTodos() {
        String sql = "Select * FROM pedido";
        List<Pedido> listaPedidos = null;
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            if (rs == null) {
                return null;
            } else {
                return crearListaPedido(rs, listaPedidos);
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    @Override
    public Pedido getPorId(Long valorId) {
        String sql = "Select p.* FROM pedido p WHERE  p.id_pedido = ?";
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            ps.setLong(1, valorId);
            ResultSet rs = ps.executeQuery();
            if (rs.first()) {
                Pedido p;
                p = new Pedido(
                        rs.getLong("id_pedido"),
                        ClienteDAO.getInstancia().getPorId(rs.getLong("cliente_id")),
                        rs.getDate("fecha"),
                        rs.getFloat("total"),
                        //lista de items
                        ItemPedidoDAO.getInstancia().listarTodosPorPedido(rs.getLong("id_pedido")),
                        rs.getString("direccion_entrega"),
                        EstadosPedido.valueOf(rs.getString("estado")),
                        rs.getDate("fecha_entrega"),
                        PagoDAO.getInstancia().getPorId((rs.getLong("pago_id_pago"))),
                        TipoPago.valueOf(rs.getString("tipo_pago")),
                        rs.getBoolean("pagado"),
                        rs.getBoolean("entregar"),
                        UsuarioDAO.getInstancia().getPorId(rs.getLong("usuario_id_usuario")));

                return p;
            } else {
                return null;
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    @Override//<editor-fold defaultstate="collapsed" desc="Obtener Todos los pedidos que están en ESTADO ?">
    public List<Pedido> getTodosPedidos(EstadosPedido estado) {
        String sql = "SELECT * FROM pedido WHERE estado = '" + estado.toString() + "'";
        List<Pedido> listaPedidos = null;
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            if (rs == null) {
                return null;
            } else {
                return crearListaPedido(rs, listaPedidos);
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }
    //</editor-fold>

    private List<Pedido> crearListaPedido(ResultSet rs, List<Pedido> listaPedidos) {
        listaPedidos = new ArrayList<Pedido>();
        Pedido pedido;
        try {//int n=0;
            while (rs.next()) {
                pedido = new Pedido(
                        rs.getLong("id_pedido"),
                        ClienteDAO.getInstancia().getPorId(rs.getLong("cliente_id")),
                        rs.getDate("fecha"),
                        rs.getFloat("total"),
                        //lista de items
                        ItemPedidoDAO.getInstancia().listarTodosPorPedido(rs.getLong("id_pedido")),
                        rs.getString("direccion_entrega"),
                        EstadosPedido.valueOf(rs.getString("estado")),
                        rs.getDate("fecha_entrega"),
                        PagoDAO.getInstancia().getPorId((rs.getLong("pago_id_pago"))),
                        TipoPago.valueOf(rs.getString("tipo_pago")),
                        rs.getBoolean("pagado"),
                        rs.getBoolean("entregar"),
                        UsuarioDAO.getInstancia().getPorId(rs.getLong("usuario_id_usuario")));
                listaPedidos.add(pedido);
                //System.out.println("Tamaño de la lista" + n++);
            }
            return listaPedidos;
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    @Override
    public Pedido insertar(Pedido t) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Pedido modificar(Pedido pedido) {
        // Se crea el objeto PreparedStatement.
        // Este precompila la sentencatia SQL especificada.
        // Los signos de interrogación señalan el lugar en que deben establecerse los
        // parámetros antes de que se ejecute la sentencia.
//        System.out.println("PedidoDAO modificar");
        String sql = "UPDATE pedido SET "
                + "id_pedido = ?, "
                + "fecha = ? ,"
                + "total = ?,"
                + "cliente_id= ?,"
                + "fecha_entrega =? ,"
                + "pagado =? ,"
                + "usuario_id_usuario = ? ,"
                + "entregar = ? ,"
                + "direccion_entrega = ? ,"
                + "estado = ? ,"
                + "tipo_pago = ? ,"
                + "pago_id_pago = ? "
                + "WHERE id_pedido = ? ";
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            // Se establecen los parámetros y se ejecuta la sentencia.
//id del PEDIDO
            ps.setLong(1, pedido.getId());
//fecha del PEDIDO
            ps.setDate(2, pedido.datetoSqldate(pedido.getFecha()));
//total del PEDIDO
            ps.setFloat(3, pedido.getTotal());
//id del CLIENTE del PEDIDO
            ps.setLong(4, pedido.getCliente().getId());
//fecha de Entrega del PEDIDO
            ps.setDate(5, pedido.datetoSqldate(pedido.getFecha_entrega()));
//Está PAGADO el PEDIDO?
            ps.setBoolean(6, pedido.getPagado());
//id USUARIO
            ps.setLong(7, Session.getInstance().getUsuario().getId());
            //le ponemos 0, ahora, luego imprementamos
//ENTREGAR
            ps.setBoolean(8, pedido.getEntregar());
//Direccion Entrega
            ps.setString(9, pedido.getDireccion_Entrega());
//ESTADO
            ps.setString(10, pedido.getEstado().toString());
//Tipo_Pago
            ps.setString(11, pedido.getTipopago().toString());
//Pago_id_pago
            PagoDAO.getInstancia().modificar(pedido.getPago());
            ps.setLong(12, pedido.getPago().getId());
//ProductoDAO.getInstancia().getPorId(rs.getLong("producto_id")));
            ps.setLong(13, pedido.getId());
            System.out.println("Imprimo sentencia SQL " + ps.toString());
            ps.executeUpdate();

            return pedido;
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    public Boolean eliminarProductoPorPedido(long pedido_id) {
        String sql = "UPDATE producto, itempedido SET producto.total = producto.total - itempedido.cantidad "
                + "WHERE producto.id_producto = itempedido.producto_id and itempedido.pedido_id =?";
        try {
            PreparedStatement ps = FabricaDAO.getConnection().prepareStatement(sql);
            ps.setLong(1, pedido_id);
            System.out.println("Imprimo sentencia SQL " + ps.toString());

            ps.executeUpdate();
        
            return true;
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
            return false;
        }
    }
}
